package com.no1.musicmgr.controller;

import com.no1.musicmgr.util.FileUtils;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@RestController
@RequestMapping("/file")
public class FileController {

    @Value("${spring.servlet.multipart.location}")
    private String filePath;

    @Value("${project.file.access-path}")
    private String fileMapper;

    private final HttpServletRequest request;
    public FileController(HttpServletRequest request) {
        this.request = request;
    }

    /**
     * 上传文件
     * 该方法负责处理文件上传请求它使用MultipartFile类型来接收上传的文件，并将其保存到指定的位置
     * 如果上传成功，它将返回文件的访问URL如果发生IO异常，它将抛出一个运行时异常
     *
     * @param file 用户上传的文件，通过@RequestParam注解指定该参数为请求中的file参数
     * @return 成功上传后返回文件的访问URL
     */
    @PostMapping("/upload")
    public String upload(@RequestParam("file")MultipartFile file){
        try{
            // 使用FileUtils工具类将文件上传到指定的文件路径，并返回上传后的文件名
            String fileName = FileUtils.uploadFile(filePath, file);
            // 根据上传后的文件名，获取文件的访问URL
            return getFileUrl(fileName);
        } catch (IOException e) {
            // 如果在文件上传过程中发生IO异常，则包装为运行时异常抛出
            throw new RuntimeException(e);
        }
    }

    /**
     * 根据文件名获取文件的URL地址
     *
     * 此方法通过接收文件名，结合当前请求的协议、服务器名称、服务器端口和文件映射路径，
     * 构建并返回文件的完整URL地址
     *
     * @param fileName 文件名
     * @return 文件的URL地址
     */
    private String getFileUrl(String fileName){
        // 使用当前请求的协议、服务器名称和端口，结合文件映射路径和文件名，构建文件的URL地址
        return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + fileMapper + fileName;
    }

}
